package com.company.algo.DP.subseqProblem.editDistance;

/**72. 编辑距离
 * 给你两个单词 word1 和 word2，请你计算出将 word1 转换成 word2 所使用的最少操作数 。
 你可以对一个单词进行如下三种操作：
     插入一个字符
     删除一个字符
     替换一个字符
 dp[i][j]：以i-1为结尾的word1子串转化为j-1为结尾word2子串所需最小操作数
 当word1[i]==word2[j],无需额外操作，dp[i][j] = dp[i-1][j-1]
 当word1[i]!=word2[j]，有三种操作使之相等
 1. 插入一个字符: dp[i][j] = dp[i][j-1] + 1
 2. 删除一个字符：dp[i][j] = dp[i-1][j] + 1
 3. 替换一个字符：dp[i][j] = dp[i-1][j-1] + 1
 初始化：dp[i][0] = i, dp[0][j] = j(增加i个字符或删除j个字符使之成为空字符串or目标字符串)
 */
public class WordEditDistance {
    public int minDistance(String word1, String word2) {
        int len1 = word1.length();
        int len2 = word2.length();
        int[][] dp = new int[len1+1][len2+1];
        for(int i = 0; i <= len1; i++) dp[i][0] = i;
        for(int j = 0; j <= len2; j++) dp[0][j] = j;
        for(int i = 1; i <= len1; i++){
            for(int j = 1; j <= len2; j++){
                if(word1.charAt(i-1) == word2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1];
                }else {
                    dp[i][j] = Math.min(Math.min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
                }
            }
        }
        return dp[len1][len2];
    }
}
